/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import jpa.Sede;

/**
 *
 * @author admin
 */
@Stateless
public class GestioneSedi implements GestioneSediLocal {

    @PersistenceContext
    private EntityManager em;

    public List<Sede> listaSedi(int start, int end) {
        Query query = em.createNamedQuery("Sede.findAll");
        query = query.setFirstResult(start);
        query = query.setMaxResults(end);
        List<Sede> result = query.getResultList();
        if (result == null) {
            result = new LinkedList<>();
        }
        return result;
    }

    public int numeroSedi() {
        Long result = (Long) em.createNamedQuery("Sede.countSede").getSingleResult();
        return result.intValue();
    }

    public void riempiDB() {
        for (int i = 0; i < 97; i++) {
            Sede s = new Sede();
            s.setCitta("citta " + i);
            int cap = i * 100;
            s.setCap(cap);
            em.persist(s);
        }
    }

    public List<Sede> listaSedi() {
        Query query = em.createNamedQuery("Sede.findAll");
        return query.getResultList();
    }

    public Sede getSede(Integer corso_Id) {
        return em.find(Sede.class, corso_Id);
    }

    public boolean crea(Sede t) {
        Query query = em.createNamedQuery("Sede.findByCitta");
        query.setParameter("citta", t.getCitta());
        List<Sede> lista = query.getResultList();
        if (lista == null) {
            em.persist(t);
            em.flush();
            return true;
        }
        for (Sede s : lista) {
            if (s.getVia().toUpperCase().equals(t.getVia().toUpperCase())) {
                return false;
            }
        }
        em.persist(t);
        em.flush();
        return true;
    }

    public boolean modifica(Sede t) {
        if (controllaSedeScartando(t)) {
            Sede vecchia = em.find(Sede.class, t.getId());
            em.remove(vecchia);
            em.flush();
            em.persist(t);
            em.flush();
            return true;
        }
        return false;
    }

    public boolean elimina(Integer id) {
        Sede c = em.find(Sede.class, id);
        if (c == null) {
            return false;
        }
        // TODO bisogna eliminare anche i corsi associati
        em.remove(c);
        em.flush();
        return true;
    }

    private boolean controllaSedeScartando(Sede t) {
        Query query = em.createNamedQuery("Sede.findAll");
        List<Sede> sedi = query.getResultList();
        for (Sede s : sedi) {
            if (s.getCitta().toUpperCase().equals(t.getCitta().toUpperCase())) {
                if (s.getVia().toUpperCase().equals(t.getVia().toUpperCase())) {
                    if (!s.getId().equals(t.getId())) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    public String getNomeSede(Integer id) {
        Sede s = em.find(Sede.class, id);
        if (s == null) {
            return "";
        }
        return s.getCitta() + ", " + s.getVia();
    }

}
